home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / gfx / board / Graffiti_lib.lha / Graffiti / g3d.c < prev    next >
C/C++ Source or Header  |  1997-03-29  |  6KB  |  323 lines

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #include <exec/memory.h>
  7. #include <dos/dos.h>
  8. #include <devices/timer.h>
  9. #include <utility/hooks.h>
  10.  
  11. #include "graffiti.h"
  12.  
  13. #include <proto/exec.h>
  14. #include <proto/graphics.h>
  15. #include <proto/timer.h>
  16.  
  17. void __regargs __chkabort (void);
  18. void __regargs __chkabort (void)
  19. {
  20. }
  21.  
  22. extern WORD fastsin (WORD, WORD);
  23. extern WORD fastcos (WORD, WORD);
  24.  
  25. /* #define fastsqrt(val) ((int) sqrt ((double)(val))) */
  26.  
  27. long fastsqrt (long a)
  28. {
  29.     static long last=1,x=1;
  30.     long xn;
  31.     long t;
  32.  
  33.     if (!a)
  34.     return 0;
  35.  
  36.     t = (a+1)>>1;
  37.     xn = (last > a) ? t : x;
  38.  
  39.     t=0;
  40.  
  41.     do
  42.     {
  43.     x=xn;
  44.     xn=(a/x+x+1) >> 1;
  45.     }
  46.     while (x!=xn && t++<16);
  47.  
  48.     last = x;
  49.  
  50.     return x;
  51. }
  52.  
  53. struct SurfDesc
  54. {
  55.     UBYTE r,g,b;  /* color of the surface */
  56.     WORD x,y,z;   /* Direction vector */
  57. };
  58.  
  59. #define LEN_LS        (1.732050808)
  60.  
  61. #if 0 /* Moiree */
  62. UBYTE GetSurfColor (struct GraffitiHandle * gh, struct SurfDesc * sd)
  63. {
  64.     LONG phi;
  65.     UBYTE r,g,b;
  66.     register LONG x,y,z;
  67.  
  68.     x = sd->x << 8;
  69.     y = sd->y << 8;
  70.     z = sd->z << 8;
  71.  
  72.     phi = (-x - y + z) /
  73.         ((fastsqrt(x*x + y*y + z*z)
  74.         *1732050)/1000000);
  75.  
  76.     r = (sd->r*phi) >> 8;
  77.     g = (sd->g*phi) >> 8;
  78.     b = (sd->b*phi) >> 8;
  79.  
  80.     return Graffiti_FindBestMatch (gh, r,g,b);
  81. } /* GetSurfColor */
  82. #endif
  83.  
  84. UBYTE GetSurfColor (struct GraffitiHandle * gh, struct SurfDesc * sd)
  85. {
  86.     LONG phi;
  87.     UBYTE r,g,b;
  88.     register LONG x,y,z;
  89.  
  90.     x = sd->x;
  91.     y = sd->y;
  92.     z = sd->z;
  93.  
  94.     phi = ((-x - y + z)<<8) /
  95.         ((fastsqrt(x*x + y*y + z*z)*173)/100);
  96.  
  97.     phi = 402-phi-((phi*phi*phi)>>16)/6; /* arccos */
  98.  
  99. #define AMBIENT 100
  100.  
  101.     phi = (256 - phi) + AMBIENT;
  102.  
  103.     /* phi = (phi * 9) / 6; */
  104.  
  105.     if (phi > 255)
  106.     {
  107.     r=g=b=255;
  108.     }
  109.     else
  110.     {
  111.     if (phi < AMBIENT)
  112.         phi = AMBIENT;
  113.  
  114.     r = (sd->r*phi) >> 8;
  115.     g = (sd->g*phi) >> 8;
  116.     b = (sd->b*phi) >> 8;
  117.     }
  118.  
  119.     return Graffiti_FindBestMatch (gh, r,g,b);
  120. } /* GetSurfColor */
  121.  
  122. void Rect (struct GraffitiHandle * gh, int x1, int y1, int x2, int y2, int z)
  123. {
  124.     int x, y;
  125.  
  126.     z <<= 4;
  127.  
  128.     for (y=y1; y<y2; y++)
  129.     for (x=x1; x<x2; x++)
  130.         Graffiti_SetPixel3D (gh, x, y, z);
  131. } /* Rect */
  132.  
  133. void Cyl (struct GraffitiHandle * gh, int x1, int y1,
  134.     int x2, int y2, int z1,
  135.     int r, int rot, int gruen, int blau)
  136. {
  137.     int x, y, z, r2, r3, t;
  138.     UBYTE col;
  139.     struct SurfDesc sd;
  140.  
  141.     r2 = r*r;
  142.     r3 = r<<4;
  143.  
  144.     z1 <<= 4;
  145.  
  146.     sd.r = rot;
  147.     sd.g = gruen;
  148.     sd.b = blau;
  149.  
  150.     if (y1==y2)
  151.     {
  152.     sd.x = -r;
  153.  
  154.     for (y=-r; y<=+r; y++)
  155.     {
  156.         z = fastsqrt((r2 - y*y)<<8);
  157.  
  158.         sd.y = y;
  159.         sd.z = z>>4;
  160.  
  161.         /* col = Graffiti_FindBestMatch (gh, rot*z/r3, gruen*z/r3, blau*z/r3); */
  162.         col = GetSurfColor (gh, &sd);
  163.  
  164.         z += z1;
  165.         t = y1+y;
  166.  
  167.         for (x=x1; x<=x2; x++)
  168.         {
  169.         Graffiti_SetPixel3DColor (gh, x, t, z, col);
  170.         }
  171.     }
  172.     }
  173.     else
  174.     {
  175.     sd.y = -r;
  176.  
  177.     for (x=-r; x<=+r; x++)
  178.     {
  179.         z = fastsqrt((r2 - x*x)<<8);
  180.  
  181.         sd.x = x;
  182.         sd.z = z>>4;
  183.  
  184.         /* col = Graffiti_FindBestMatch (gh, rot*z/r3, gruen*z/r3, blau*z/r3); */
  185.         col = GetSurfColor (gh, &sd);
  186.  
  187.         z += z1;
  188.         t = x1+x;
  189.  
  190.         for (y=y1; y<=y2; y++)
  191.         {
  192.         Graffiti_SetPixel3DColor (gh, t, y, z, col);
  193.         }
  194.     }
  195.     }
  196. } /* Cyl */
  197.  
  198. void Ball (struct GraffitiHandle * gh, int cx, int cy, int cz, int r,
  199.     int rot, int gruen, int blau)
  200. {
  201.     int x, y, z, r2, y2, r3;
  202.     int xmin, xmax, ymin, ymax;
  203.     UBYTE col;
  204.     struct SurfDesc sd;
  205.  
  206.     r2 = r*r;
  207.     r3 = r<<4;
  208.  
  209.     cz <<= 4;
  210.  
  211.     xmin = ymin = -r;
  212.     xmax = ymax = +r;
  213.  
  214.     if (ymin + cy < 0)
  215.     ymin = -cy;
  216.     if (xmin + cx < 0)
  217.     xmin = -cx;
  218.  
  219.     sd.r = rot;
  220.     sd.g = gruen;
  221.     sd.b = blau;
  222.  
  223.     for (y=ymin; y<=ymax; y++)
  224.     {
  225.     y2 = y + cy;
  226.     sd.y = y;
  227.  
  228.     for (x=xmin; x<=xmax; x++)
  229.     {
  230.         sd.x = x;
  231.         z = x*x + y*y;
  232.  
  233.         if (z <= r2)
  234.         {
  235.         z = fastsqrt ((r2 - z)<<8);
  236.         /* col = Graffiti_FindBestMatch (gh, rot*z/r3, gruen*z/r3, blau*z/r3); */
  237.         sd.z = z>>4;
  238.         col = GetSurfColor (gh, &sd);
  239.         Graffiti_SetPixel3DColor (gh, x+cx, y2, z+cz, col);
  240.         }
  241.     }
  242.     }
  243. } /* Ball */
  244.  
  245. int main (int argc, char ** argv)
  246. {
  247.     struct GraffitiHandle * gh;
  248.     struct IntuiMessage * im;
  249.     ULONG width;
  250.     int mode;
  251.     int white;
  252.     UBYTE col;
  253.  
  254.     /* Init card */
  255.     if (argc == 1)
  256.     {
  257.     gh = Graffiti_Init (
  258.         GTI_3D, TRUE,
  259.         TAG_END);
  260.     }
  261.     else
  262.     {
  263.     mode = atoi (argv[1]);
  264.  
  265.     if (mode < 0 || mode > 1)
  266.     {
  267.         fprintf (stderr, "Mode must be between 0 or 1\n");
  268.         return 10;
  269.     }
  270.  
  271.     gh = Graffiti_Init (
  272.         GTI_RESOLUTION, mode ? GRAFFITI_RES_640 : GRAFFITI_RES_320,
  273.         GTI_3D, TRUE,
  274.         TAG_END);
  275.     }
  276.  
  277.     Graffiti_InstallDefaultPalette (gh);
  278.  
  279.     Graffiti_GetAttr (gh, GTI_WIDTH, &width);
  280.  
  281.     white = Graffiti_FindBestMatch (gh, 255,255,255);
  282.  
  283.     Graffiti_SetFG (gh, white);
  284.     Rect (gh, 30,40, 270,110, 30);
  285.  
  286.     Cyl (gh, 20,128, 300,128, 0, 40, 255,255,255);
  287.     Cyl (gh, 160,28, 160,238, 0, 40, 0,255,0);
  288.     Cyl (gh, 68,180, 220,180, 20, 10, 255,0,0);
  289.  
  290.     Ball (gh, 270,50,50, 30, 0,0,255);
  291.     Ball (gh, 70,80,-50, 110, 0,0,255);
  292.  
  293.     Ball (gh,  30,230,20, 30, 0,0,255);
  294.     Ball (gh,  80,230,20, 30, 0,0,255);
  295.     Ball (gh, 130,230,20, 30, 0,0,255);
  296.     Ball (gh, 180,230,20, 30, 0,0,255);
  297.     Ball (gh, 230,230,20, 30, 0,0,255);
  298.  
  299. #if 0
  300.     col = Graffiti_FindBestMatch (gh, 255,0,0);
  301.     Graffiti_SetFG (gh, col);
  302.     Rect (gh, 10, 20, 60, 25, 0x80);
  303.  
  304.     col = Graffiti_FindBestMatch (gh, 0,255,0);
  305.     Graffiti_SetFG (gh, col);
  306.     Rect (gh, 20, 10, 25, 40, 0x40);
  307.  
  308.     col = Graffiti_FindBestMatch (gh, 0,0,255);
  309.     Graffiti_SetFG (gh, col);
  310.     Rect (gh, 40, 10, 45, 40, 0xc0);
  311. #endif
  312.  
  313.     im = Graffiti_WaitEvent (gh);
  314.  
  315.     if (im)
  316.     ReplyMsg ((struct Message *)im);
  317.  
  318.     /* Exit demo */
  319.     Graffiti_Exit (gh);
  320.  
  321.     return 0;
  322. } /* main */
  323.